/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package View;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfPTable;
import controller.FichaController;
import controller.LoteController;
import exception.DuplicateConstraintException;
import exception.RemoveConstraintException;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletContext;
import model.entidades.Ficha;
import model.entidades.Lote;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.Conversation;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ConversationScoped;

/**
 *
 * @author helton
 */
@Named
@ConversationScoped
public class FichaView implements View, Serializable {

    @Inject
    FichaController controller;
    @Inject
    LoteController loteController;
    @Inject
    Conversation conversation;
    private Ficha ficha;
    private List<Ficha> fichas;
    private List<Ficha> print;
    private List<Lote> lotes;
    private Map<String, String> status = new HashMap<String, String>();
    private Lote lote;
    private final static String[] opcoes;
    private SelectItem[] opcoesFiltro;

    public FichaView() {
        opcoesFiltro = createFilterOptions(opcoes);
    }

    @Override
    @PostConstruct
    public void init() {
        ficha = new Ficha();
    }

    @Override
    public void closeConversation(ActionEvent event) {
        conversation.close();
    }

    public String actionEnviar() throws DuplicateConstraintException {
        lote = controller.enviarFichas();

        if (lote != null) {
            return printFichas();
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_WARN, "Não existem fichas para serem enviadas!", ""));
            return actionListar();
        }
    }

    public String filtraFichas() {
        print = null;
        return printFichas();
    }

    public String printFichas() {
        return "printFichas";
    }

    @Override
    public String actionNovo() {
        ficha = new Ficha();
        ficha.setDataReceb(new Date());

        return "cadastrarFicha";
    }

    @Override
    public String actionSalvar() throws DuplicateConstraintException {
        ficha.setNome(ficha.getNome().toUpperCase());
        if (ficha.getLote() == null) {
            if (ficha.getId() == null) {
                controller.insert(ficha);
            } else {
                controller.update(ficha);
            }
            fichas = null;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_INFO, "Ficha salva com sucesso!", ""));
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_WARN, "Fichas enviadas não podem ser alteradas", ""));
            fichas = null;
        }
        return actionListar();
    }

    @Override
    public String actionListar() {
        return "listarFicha";
    }

    @Override
    public void actionRemover() throws RemoveConstraintException {
        if (ficha.getLote() == null) {
            controller.remove(ficha);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_INFO, "Ficha foi deletada!", ""));
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_WARN, "Fichas enviadas não podem ser removidas!", ""));
        }
        fichas = null;
    }

    public void preProcessPDF(Object document) throws IOException, BadElementException, DocumentException {
        //cria o documento  
        Document pdf = (Document) document;

        //seta a margin e página, precisa estar antes da abertura do documento, ou seja da linha: pdf.open()  
        pdf.setMargins(20, 20, 20, 20);
        pdf.setPageSize(PageSize.A4.rotate());
        pdf.addTitle("Controle de Fichas 8/14");

        pdf.open();

        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String logo = servletContext.getRealPath("") + File.separator + "resources/imagens" + File.separator + "logo.png";

        Image image = Image.getInstance(logo);
        image.setAlignment(Image.ALIGN_CENTER);
        pdf.add(image);

        //adiciona um paragrafo ao pdf, alinha também ao centro  
        Paragraph p;
        p = new Paragraph("Prefeitura de Campo Grande\n"
                + "Secretaria Municipal de Saúde Pública\n"
                + "Coordenadoria de Tecnologia da Informação \n");
        p.setAlignment(Element.ALIGN_CENTER);
        pdf.add(p);

        p = new Paragraph("Controle de Fichas 8/14 - Lote N.: " + lote.getId() + "\n\n");
        p.setAlignment(Element.ALIGN_CENTER);
        pdf.add(p);

        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        PdfPTable table = new PdfPTable(3);
        table.addCell("Data de Expedição");
        table.addCell("Data de Recebimento");
        table.addCell("Recebido por");
        table.addCell(dateFormat.format(date).toString());
        table.addCell("");
        table.addCell("");
        pdf.add(table);

        p = new Paragraph("\n");
        pdf.add(p);
    }

    public Ficha getFicha() {
        return ficha;
    }

    public void setFicha(Ficha ficha) {
        this.ficha = ficha;
    }

    public List<Ficha> getFichas() {
        if (fichas == null) {
            fichas = controller.getAll();
        }
        return fichas;
    }

    public void setFichas(List<Ficha> fichas) {
        this.fichas = fichas;
    }

    public List<Ficha> getPrint() {
        if (print == null) {
            if (lote != null) {
                print = controller.printFichas(lote);
            }
        }
        return print;
    }

    public void setPrint(List<Ficha> print) {
        this.print = print;
    }

    public Map<String, String> getStatus() {

        status.put("Enviado", "Enviado");
        status.put("Não Enviado", "Não Enviado");
        status.put("Arquivado", "Arquivado");
        status.put("Devolvido", "Devolvido");

        return status;
    }

    static {
        opcoes = new String[4];

        opcoes[0] = "Não Enviado";
        opcoes[1] = "Enviado";
        opcoes[2] = "Arquivado";
        opcoes[3] = "Devolvido";
    }

    private SelectItem[] createFilterOptions(String[] data) {
        SelectItem[] options = new SelectItem[data.length + 1];

        options[0] = new SelectItem("", "Status");
        for (int i = 0; i < data.length; i++) {
            options[i + 1] = new SelectItem(data[i], data[i]);
        }

        return options;
    }

    public SelectItem[] getFilterOptions() {
        return opcoesFiltro;
    }

    public void setStatus(Map<String, String> status) {
        this.status = status;
    }

    public Lote getLote() {
        return lote;
    }

    public void setLote(Lote lote) {
        this.lote = lote;
    }

    public List<Lote> getLotes() {
        if (lotes == null) {
            lotes = loteController.getAll();
        }
        return lotes;
    }

    public void setLotes(List<Lote> lotes) {
        this.lotes = lotes;
    }
}
